package com.interview.item.javabase.threadReturn;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

/**
 * @Author:zxh 有返回值的多线程
 * @Description: 有返回值的任务必须实现 Callable 接口，类似的，无返回值的任务必须 Runnable 接口。执行
Callable 任务后，可以获取一个 Future 的对象，在该对象上调用 get 就可以获取到 Callable 任务
返回的 Object 了，再结合线程池接口 ExecutorService 就可以实现传说中有返回结果的多线程
了。
 * @Date: 2020/8/15
 * @Modified By:
 */
public class FutureTest {

    public static void main(String[] args)throws Exception {
        int taskSize = 13;
        //1.创建一个线程池
        ExecutorService pool = Executors.newFixedThreadPool(taskSize);
        //2.创建多个返回值任务
        List<Future> list = new ArrayList<Future>();
        for (int i = 0; i < taskSize; i++) {
            Callable callable = new MyCallabe(i+"");
            //执行任务并获取Future对象
            Future submit = pool.submit(callable);
            list.add(submit);
        }

        //3.关闭线程池
        pool.shutdown();

        //4.获取所有并发任务的运行结果
        for (Future f:list) {
            //从Future对象上获取任务的返回值，并输出到控制台
            System.out.println("res"+f.get().toString());
        }


    }

    static class MyCallabe implements Callable {
        String str;

        public  MyCallabe(String str) {
            this.str = str;
        }

        @Override
        public Object call() throws Exception {
            return null;
        }
    }


}
